package cn.lyvust.method;

/**
 * Description:
 *
 * date: 2021-6-15 20:10
 *
 * @author Guo_guo
 * @since JDK 1.8
 */
public class Done {
    //java中的类是由用户自己定义的一种类型，类似于Java自带的八种基本类型

    //类中的变量有:静态变量（类级别的）、成员变量（对象级别的）、局部变量（方法级别的）；
    private int x;   //非静态成员变量，又称为属性（成员变量），对该类不同的对象来说，属性是不同的, 隶属于对象
    private static int y;  //静态(全局)成员变量，一个类中只有一个该变量，该类不同的对象共享同一个静态成员变量
    static {
        System.out.println("我是类中的静态代码块,我最优先执行!!");
    }

    public static void main(String[] args) {
        int m = 0;   //局部变量，是方法内部定义的变量，只在方法内部可见，在该方法结束后，由垃圾回收器自动回收

        staticMethod();//直接在静态函数里面调用静态函数，但是不可以直接调用noStaticMethod()函数
        Done.staticMethod(); //静态函数可以直接通过类来调用

        Done done = new Done(); //通过new来构造Done这个类的一个对象出来，此时会默认调用构造函数
        done.noStaticMethod();  //通过对象去调用非静态函数(成员函数),因为成员函数隶属于对象而不是类的

    }

//    类中的方法有静态方法（类级别的）、成员方法（对象级别的）、构造方法（对象级别的）；
//    类级别的不能调用对象级别的，因为在类加载时期对象还没有产生，
//    例如：在静态方法中只能调用静态方法和静态变量，而不能调用对象级别的成员方法和成员变量。
//    成员方法必须用类的实例化对象进行访问，而全局方法是直接可以用类名.方法名来访问的，构造方法则是实例化对象时进行初始化的

    // 无参构造函数,当定义对象的时候会自动调用
    public Done() {
        this.x = 10;
        System.out.println("我是构造函数");
    }

    public void noStaticMethod() {
        System.out.println("我是非静态函数，又称成员方法，我是隶属于对象的，只能用对象来调用");
    }
    public static void staticMethod() {
        System.out.println("我是静态函数，我是隶属于类的，可以直接用类来调用");
    }
}
